#define _CRT_SECURE_NO_WARNINGS 1

#include"10.6.h"
void SLInit(SL* sl)
{
	sl->a=(DateType*)malloc(sizeof(DateType)*4);
	if (sl->a == NULL)
	{
		perror("malloc fail!");
		return;
	}
	sl->size = 0;
	sl->capacity = 4;
}

void IsEmpty(SL* sl)
{
	if (sl->size == 0)
	{
		printf("SL is empty\n");
		/*assert(sl->size == 0);*/
		return;
	}
}

void IsFull(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		DateType* tmp = (DateType*)realloc(sl->a,sizeof(DateType)*sl->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		sl->a = tmp;
		sl->capacity = sl->capacity * 2;
	}
}


void SLInsert(SL* sl, DateType x, int pos)
{
	assert(sl);
	IsFull(sl);
	int end = sl->size;
	while(end > pos)
	{
		sl->a[end] = sl->a[end-1];
		end--;
	}
	sl->a[pos] = x;
	sl->size++;
}
void SLInsertFront(SL* sl, DateType x)
{
	assert(sl);
	SLInsert(sl, x, 0);
}
void SLInsertTail(SL* sl, DateType x)
{
	assert(sl);
	SLInsert(sl, x, sl->size);
}
void SLPop(SL* sl, int pos)
{
	assert(sl);
	IsEmpty(sl);
	if (0 <= pos && pos < sl->size)
	{
		while (pos < sl->size)
		{
			sl->a[pos] = sl->a[pos + 1];
			pos++;
		}
	}
	sl->size--;
}
void SLPopFront(SL* sl)
{
	SLPop(sl, 0);
}
void SLPopTail(SL* sl)
{
	SLPop(sl, sl->size-1);
}
void SLPrint(SL* sl)
{
	IsEmpty(sl);
	int i = 0;
	for (i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}

void SLFree(SL* sl)
{
	assert(sl);
	free(sl->a);
	sl->a = NULL;
	sl->capacity = 0;
	sl->size = 0;
}